// 父类 ：公共属性和方法
function Person(){
    this.name = "why",
    this.friends = []
}

Person.prototype.eating = function(){
    console.log(this.name + "eating")
}

//子类：特有的属性和方法
function Student(){
    // this.name = name
    this.sno = 111
}

var p = new Person()

Student.prototype = p

Student.prototype.studying = function(){
    console.log(this.name + "studying~~")
}

var stu = new Student()

// console.log(stu.name)
// stu.eating()
// stu.studying()

//原型链实现继承的弊端：
// 第一个弊端1.打印stu对象，继承的属性是看不到的
// console.log(stu)

// 第二个弊端 2.创建出来两个stu的对象
var stu1 = new Student()
var stu2 = new Student()

//获取引用，修改引用中的值，会相互影响
// stu1.friends.push("kobe")

// console.log(stu1.friends)
// console.log(stu2.friends)
// 直接修改对象上的属性，是给本对象添加一个新的属性
stu1.name = "kobe"
console.log(stu2.name)

// 第三个弊端:在前面实现类的过程中都没有传递参数
var stu3 = new Student("lilei",112)

// 解决方案:借用构造函数继承 为了解决原型链继承中存在的问题，开发人员提供了一种新的技术，construct stealing 借用构造函数 经典继承或伪造对象
//steal是偷窃的意思，翻译成借用
